package com.linkdood.app.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.linkdood.app.domain.*;
import com.linkdood.app.dto.*;
import com.linkdood.app.security.UserModelDetailsServiceImpl;
import com.linkdood.app.vm.AccountVM;

import java.util.List;
import java.util.Optional;
import java.util.Set;


/**
 * 系统用户
 *
 * @author YunJ
 */

public interface AccountService extends IService<Account> {
    /**
     * 获取当前用户的 accountId
     * Authentication.getName 为 username, 是在
     *
     * @see UserModelDetailsServiceImpl 中指定的
     */
    String getCurrentAccountId();


    /**
     * 获取当前登录用户账号
     */
    Account getCurrentAccount();

    /**
     * 获取当前登录用户的信息
     */
    AccountVM getCurrentAccountInfo();


    Optional<Account> getAccount(String userId);


    // FIXME 多表联合分页查询，暂时使用 Mybatis 旧版 XML 格式，以后优化
    Page<AccountVM> pageAccounts(String displayName, String role, String username, Page<Account> page);

    /**
     * 创建用户并绑定
     * @param accountDTO 入参DTO
     * @return AccountVM
     */
    AccountVM saveAccount(AccountDTO accountDTO);

    /**
     * 创建用户，支持设置角色和绑定用户
     * @param account 用户信息
     * @param customRoleId 角色
     */
    Account saveAccount(Account account, String customRoleId);

    void resetPassword(String id);


    AccountVM update(String accountId, AccountDTO accountDTO);

    /**
     * 更新用户密码
     */
    AccountVM updateAccountPassword(Account account, PasswordDTO params);

    /**
     * 验证用户名是否存在
     * 如果存在，随机生成一个；
     * 如果不存在，将输入的用户名返回
     */
    String checkUsername(String username);



    /**
     * 检查用户名是否存在
     * @param username 用户名(手机号)
     * @return true/false
     */
    boolean accountIsExist(String username);

    /**
     * 用户注册
     * @param req 注册入参
     */
    void register(RegisterDTO req);

    /**
     * 设置新密码(忘记密码)
     * @param req 新密码入参
     */
    void newPassword(ResetPasswordDTO req);

    /**
     * 更新用户名
     * @param accountId 账户id
     * @param req 验证码参数
     */
    void updateUserName(String accountId, PhoneCodeDTO req);

    /**
     * 获取菜单数据权限
     *
     * @param id 用户信息
     * @return 菜单权限信息
     */
    Set<String> getMenuPermission(String id);


    List<Account> listAccountByUserName(String userName);

    Optional<Account> getAccountByUserName(String userName);
}
